package cn.dazhou.railway.monitor.network

import com.google.gson.internal.`$Gson$Types`
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

/** 请求回调接口，泛型T为希望请求返回的数据类型 */
abstract class ApiRequestCallback<T> {

    var type: Type

    init {
        type = getSuperclassTypeParameter(javaClass)
    }

    private fun getSuperclassTypeParameter(subclass: Class<*>): Type {
        val superclass = subclass.genericSuperclass
        if (superclass is Class<*>) {
            throw RuntimeException("Missing type parameter.")
        }
        // ParameterizedType翻译为“参数化类型”，即这个类型是带有参数的，说白了就是带泛型的类型
        // 如：Collection<String>是一个参数化类型
        // Type Arguments翻译为“类型参数”，即类型的参数，如Collection<String>是一个类型，这个类型的参数为String，参数可以有多个。
        // Parameter和Arguments都是参数的意思
        val parameterized = superclass as ParameterizedType?
        return `$Gson$Types`.canonicalize(parameterized!!.actualTypeArguments[0])
    }

    /** 请求成功时回调此方法，当RequestResult参数不为空，且RequestResult.success属性为true时才会调用此方法 */
    abstract fun onApiRequestSuccess(requestResult: T)

    /** 请求失败时回调此方法，参数failCause为失败的原因 */
    abstract fun onApiRequestFail(failCause: String)

}